package org.diancai.diancai.utils;

import lombok.Data;

/**
 * 统一接口返回格式
 * 所有接口返回数据都用此对象封装，方便前端统一处理
 */
public class Result<T> {
    // 状态码：200=成功，400=失败，401=未认证（登录失效），403=无权限，500=服务器异常
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    // 提示信息：成功/失败的描述（如"操作成功"、"用户名不存在"）
    private String msg;

    // 返回数据：接口成功时返回的具体数据（如列表、对象等，失败时可为null）
    private T data;

    // -------------- 静态方法：快速创建Result对象 --------------

    /**
     * 成功返回（带数据）
     * @param data 要返回的数据（如查询到的列表、对象）
     * @return 封装好的Result对象
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMsg("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 成功返回（带数据和自定义消息）
     * @param data 要返回的数据
     * @param message 自定义成功提示信息
     */
    public static <T> Result<T> success(T data, String message) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMsg(message);
        result.setData(data);
        return result;
    }

    /**
     * 成功返回（不带数据）
     * 适用于新增/修改/删除等无需返回具体数据的操作
     */
    public static <T> Result<T> success() {
        return success(null);
    }

    /**
     * 失败返回（业务逻辑错误，如参数错误、用户名重复）
     * @param msg 失败原因（如"密码错误"、"参数不能为空"）
     */
    public static <T> Result<T> fail(String msg) {
        Result<T> result = new Result<>();
        result.setCode(400);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }

    /**
     * 未认证返回（JWT失效、未登录时使用）
     * @param msg 提示信息（如"登录已失效，请重新登录"）
     */
    public static <T> Result<T> unauth(String msg) {
        Result<T> result = new Result<>();
        result.setCode(401);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }

    /**
     * 无权限返回（用户没有操作权限时使用）
     * @param msg 提示信息（如"没有权限执行该操作"）
     */
    public static <T> Result<T> forbidden(String msg) {
        Result<T> result = new Result<>();
        result.setCode(403);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }

    /**
     * 服务器异常返回（系统错误时使用）
     * @param msg 异常信息（如"数据库连接失败"）
     */
    public static <T> Result<T> error(String msg) {
        Result<T> result = new Result<>();
        result.setCode(500);
        result.setMsg("系统异常：" + msg);
        result.setData(null);
        return result;
    }
}